import { Application } from 'egg';
import { Model, Document, Schema } from './index.d';

interface IUserInfo {
  /** 用户id */
  userId: number;
  /** 用户名 */
  userName: string;
  /** 用户角色 */
  userRole: string;
  /** 用户组 */
  userGroup: string;
  /** 用户所属公司名 */
  companyName: string;
}

interface IElementInfo {
  /** 动作所操作元素里的文本 */
  targetElementInnerText: string;
  /** 动作所操作元素的类型 */
  targetElementType: string;
  /** 动作所操作元素的类名 */
  targetElementClsName: string;
  /** 动作所操作元素的id */
  targetElementId: string;
}

interface IRequestInfo {
  /** 请求url */
  requestUrl: string;
  /** 请求响应状态码 */
  requestStatus: number;
  /** 请求响应状态 */
  requestStatusText: string;
  /** 请求方法 */
  requestMethod: string;
  /** 请求参数 */
  requestParams: string;
  /** 请求响应信息 */
  responseBody: string;
  /** 请求消耗的时间 */
  requestCostTime: number;
}

interface ITrackAction {
  /** 动作类型 */
  action: string;
  /** 鼠标点击的屏幕x坐标 */
  clientX: number;
  /** 鼠标点击的屏幕y坐标 */
  clientY: number;
  /** 鼠标点击的屏幕x坐标 */
  offsetX: number;
  /** 鼠标点击的屏幕y坐标 */
  offsetY: number;
  /** 鼠标点击的屏幕x坐标 */
  pageX: number;
  /** 鼠标点击的屏幕y坐标 */
  pageY: number;
  /** 鼠标点击的屏幕x坐标 */
  screenX: number;
  /** 鼠标点击的屏幕y坐标 */
  screenY: number;
  /** 键盘按键代码 */
  keyCode: number;
}

interface IErrorInfo {
  /** 错误发生的行数 */
  errorLine: number;
  /** 错误发生的列数 */
  errorCol: number;
  /** 错误栈信息 */
  errorStack: string;
}

interface IDeviceInfo {
  /** 当前设备类型 */
  deviceType: string;
  /** 当前操作系统 */
  OS: string;
  /** 当前操作系统版本 */
  OSVersion: string;
  /** 当前设备屏幕高度 */
  screenHeight: string;
  /** 当前设备屏幕宽度 */
  screenWidth: string;
  /** 当前使用的语言 */
  language: string;
  /** 当前设备横竖屏状态 */
  orientation: string;
  /** 浏览器信息 */
  browserInfo: string;
  /** 浏览器指纹 */
  fingerprint: string;
  /** 浏览器代理信息 */
  userAgent: string;
}

interface ISystemInfo {
  /**  操作系统描述 */
  system: string;
  /**  应用版本 */
  appVersion: string;
  /**  接口版本 */
  apiVersion: string;
  /**  应用环境 qa, uat prod */
  environment: string;
  /**  应用系统 */
  appSystem: string;
}

export interface IMonitoringLog
  extends Partial<IUserInfo>,
    Partial<IElementInfo>,
    Partial<IRequestInfo>,
    Partial<ITrackAction>,
    Partial<IDeviceInfo>,
    Partial<ISystemInfo>,
    Partial<IErrorInfo> {
  /** 批量上报的索引值 */
  BatchIndexes?: string;
  /** 区块上报的索引值 */
  BlockIndexes?: string;
  /** 即时上报的索引值 */
  MomentIndexes?: string;
  /** log 的唯一码 */
  hash: string;
  /** 追踪id */
  traceId?: string;
  /** 请求id */
  requestId?: string;
  /** log信息、错误信息 */
  msg: string;
  /** log记录的时间 */
  time: string;
  /** log类型 */
  type: string;
  /** 当前页面的路径 */
  path?: string;
  /**  当前界面state store数据 */
  store?: string;
}

export const logSchemaConfig = {
  /** 批量上报的索引值 */
  BatchIndexes: { type: String },
  /** 区块上报的索引值 */
  BlockIndexes: { type: String },
  /** 即时上报的索引值 */
  MomentIndexes: { type: String },
  /** log 的唯一码 */
  hash: { type: String },
  /** 追踪id */
  traceId: { type: String },
  /** 请求id */
  requestId: { type: String },
  /** log信息、错误信息 */
  msg: { type: String },
  /** log记录的时间 */
  time: { type: String },
  /** log类型 */
  type: { type: String },
  /** 当前页面的路径 */
  path: { type: String },
  /**  当前界面state store数据 */
  store: { type: String },
  /** 用户id */
  userId: { type: Number },
  /** 用户名 */
  userName: { type: String },
  /** 用户角色 */
  userRole: { type: String },
  /** 用户组 */
  userGroup: { type: String },
  /** 用户所属公司名 */
  companyName: { type: String },
  /** 动作所操作元素里的文本 */
  targetElementInnerText: { type: String },
  /** 动作所操作元素的类型 */
  targetElementType: { type: String },
  /** 动作所操作元素的类名 */
  targetElementClsName: { type: String },
  /** 动作所操作元素的id */
  targetElementId: { type: String },
  /** 请求url */
  requestUrl: { type: String },
  /** 请求响应状态码 */
  requestStatus: { type: Number },
  /** 请求响应状态 */
  requestStatusText: { type: String },
  /** 请求方法 */
  requestMethod: { type: String },
  /** 请求参数 */
  requestParams: { type: String },
  /** 请求响应信息 */
  responseBody: { type: String },
  /** 请求消耗的时间 */
  requestCostTime: { type: Number },
  /** 动作类型 */
  action: { type: String },
  /** 鼠标点击的屏幕x坐标 */
  clientX: { type: Number },
  /** 鼠标点击的屏幕y坐标 */
  clientY: { type: Number },
  /** 鼠标点击的屏幕x坐标 */
  offsetX: { type: Number },
  /** 鼠标点击的屏幕y坐标 */
  offsetY: { type: Number },
  /** 鼠标点击的屏幕x坐标 */
  pageX: { type: Number },
  /** 鼠标点击的屏幕y坐标 */
  pageY: { type: Number },
  /** 鼠标点击的屏幕x坐标 */
  screenX: { type: Number },
  /** 鼠标点击的屏幕y坐标 */
  screenY: { type: Number },
  /** 键盘按键代码 */
  keyCode: { type: Number },
  /** 错误发生的行数 */
  errorLine: { type: Number },
  /** 错误发生的列数 */
  errorCol: { type: Number },
  /** 错误栈信息 */
  errorStack: { type: String },
  /** 当前设备类型 */
  deviceType: { type: String },
  /** 当前操作系统 */
  OS: { type: String },
  /** 当前操作系统版本 */
  OSVersion: { type: String },
  /** 当前设备屏幕高度 */
  screenHeight: { type: String },
  /** 当前设备屏幕宽度 */
  screenWidth: { type: String },
  /** 当前使用的语言 */
  language: { type: String },
  /** 当前设备横竖屏状态 */
  orientation: { type: String },
  /** 浏览器信息 */
  browserInfo: { type: String },
  /** 浏览器指纹 */
  fingerprint: { type: String },
  /** 浏览器代理信息 */
  userAgent: { type: String },
  /**  操作系统描述 */
  system: { type: String },
  /**  应用版本 */
  appVersion: { type: String },
  /**  接口版本 */
  apiVersion: { type: String },
  /**  应用环境 qa, uat prod */
  environment: { type: String },
  /**  应用系统 */
  appSystem: { type: String },
};

export interface IApplicationMonitorLogModel
  extends Document,
    IMonitoringLog {}
export default function monitorLog(
  app: Application,
): Model<IApplicationMonitorLogModel> {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;
  const MonitorLogSchema: Schema = new Schema(logSchemaConfig);
  return mongoose.model<IApplicationMonitorLogModel>(
    'monitor_log',
    MonitorLogSchema,
  );
}
